home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / buildsaddr.c < prev    next >
C/C++ Source or Header  |  1991-10-13  |  2KB  |  76 lines

  1. /* @(#) $Header: buildsaddr.c,v 1.4 91/10/11 18:56:11 deyke Exp $ */
  2.  
  3. #include <sys/types.h>
  4.  
  5. #include <ctype.h>
  6. #include <netdb.h>
  7. #include <netinet/in.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <sys/socket.h>
  11. #include <sys/un.h>
  12.  
  13. #include "global.h"
  14.  
  15. static union {
  16.   struct sockaddr sa;
  17.   struct sockaddr_in si;
  18.   struct sockaddr_un su;
  19. } addr;
  20.  
  21. /*---------------------------------------------------------------------------*/
  22.  
  23. struct sockaddr *build_sockaddr(name, addrlen)
  24. char  *name;
  25. int  *addrlen;
  26. {
  27.  
  28.   char  *host_name;
  29.   char  *serv_name;
  30.   char  buf[1024];
  31.  
  32.   memset(&addr, 0, sizeof(addr));
  33.   *addrlen = 0;
  34.  
  35.   host_name = strcpy(buf, name);
  36.   serv_name = strchr(buf, ':');
  37.   if (!serv_name) return 0;
  38.   *serv_name++ = '\0';
  39.   if (!*host_name || !*serv_name) return 0;
  40.  
  41.   if (!strcmp(host_name, "local") || !strcmp(host_name, "unix")) {
  42.     addr.su.sun_family = AF_UNIX;
  43.     *addr.su.sun_path = '\0';
  44.     if (*serv_name != '/') strcpy(addr.su.sun_path, "/tcp/sockets/");
  45.     strcat(addr.su.sun_path, serv_name);
  46.     *addrlen = sizeof(addr.su.sun_family) + strlen(addr.su.sun_path);
  47.     return &addr.sa;
  48.   }
  49.  
  50.   addr.si.sin_family = AF_INET;
  51.  
  52.   if (!strcmp(host_name, "*")) {
  53.     addr.si.sin_addr.s_addr = INADDR_ANY;
  54.   } else if (!strcmp(host_name, "loopback")) {
  55.     addr.si.sin_addr.s_addr = inet_addr("127.0.0.1");
  56.   } else if ((addr.si.sin_addr.s_addr = inet_addr(host_name)) == -1L) {
  57.     struct hostent *hp = gethostbyname(host_name);
  58.     endhostent();
  59.     if (!hp) return 0;
  60.     addr.si.sin_addr.s_addr = ((struct in_addr *) (hp->h_addr))->s_addr;
  61.   }
  62.  
  63.   if (isdigit(*serv_name & 0xff)) {
  64.     addr.si.sin_port = htons(atoi(serv_name));
  65.   } else {
  66.     struct servent *sp = getservbyname(serv_name, (char *) 0);
  67.     endservent();
  68.     if (!sp) return 0;
  69.     addr.si.sin_port = sp->s_port;
  70.   }
  71.  
  72.   *addrlen = sizeof(struct sockaddr_in );
  73.   return &addr.sa;
  74. }
  75.  
  76.